date_default_timezone_set('prc');/*** 求取从某日起经过一定天数后的日期,* 排除周六周日和节假日* @param $start 开始日期* @param $offset 经过天数* @param $exception 例外的节假日* @param $allow 允许的日期(预留参数)* @return* examples:输入(2010-06-25,5,''),得到2010-07-02*/function getendday( $start='now', $offset=0, $exception='', $allow='' ){ //先计算不排除周六周日及节假日的结果 $starttime = strtotime($start); $endtime = $starttime + $offset * 24 * 3600; $end = date('y-m-d', $endtime); //然后计算周六周日引起的偏移 $weekday = date('n', $starttime);//得到星期值:1-7 $remain = $offset % 7; $newoffset = 2 * ($offset - $remain) / 7;//每一周需重新计算两天 if( $remain > 0 ){//周余凑整 $tmp = $weekday + $remain; if( $tmp >= 7 ){ $newoffset += 2; }else if( $tmp == 6 ){ $newoffset += 1; } //考虑当前为周六周日的情况 if( $weekday == 6 ){ $newoffset -= 1; }else if( $weekday == 7 ){ $newoffset -= 2; } } //再计算节假日引起的偏移 if( is_array($exception) ){//多个节假日 foreach ($exception as $day){ $tmp_time = strtotime($day); if( $tmp_time>$starttime && $tmp_time $weekday_t = date('n', $tmp_time); if($weekday_t #echo "[{$start} -> {$offset}] = [{$end} -> {$newoffset}]"."n"; return getendday($end,$newoffset,$exception,$allow); }else{ return $end; }}/*** 暴力循环方法*/function getendday2( $start='now', $offset=0, $exception='', $allow='' ){ $starttime = strtotime($start); $tmptime = $starttime + 24*3600; while( $offset > 0 ){ $weekday = date('n', $tmptime); $tmpday = date('y-m-d', $tmptime); $bfd = false;//是否节假日 if(is_array($exception)){ $bfd = in_array($tmpday,$exception); }else{ $bfd = ($exception==$tmpday); } if( $weekday |